/**
* @Title: TimeServer.java
* @Package com.an.timeserver
* @Description: TODO(用一句话描述该文件做什么)
* @author antch,861710865@qq.com
* @date 2017年7月20日 下午2:39:24
* @version V1.0
*/

package com.an.timeserver;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @ClassName: TimeServer
 * @Description: TODO(时间服务器)
 * @author antch,861710865@qq.com
 * @date 2017年7月20日 下午2:39:24
 *
 */

public class TimeServer {

	/**
	 * 端口
	 */
	private int port;

	public TimeServer(int port) {
		super();
		this.port = port;
	}

	public void run() throws InterruptedException {
		// 用来接收进来的连接
		EventLoopGroup boosGroup = new NioEventLoopGroup();
		// 用来处理已经被接收的连接，一旦被boss接收到，就会把连接信息注册到worker上。
		EventLoopGroup workerGroup = new NioEventLoopGroup();

		ServerBootstrap b = new ServerBootstrap();
		b.group(boosGroup, workerGroup).channel(NioServerSocketChannel.class)
				.childHandler(new ChannelInitializer<SocketChannel>() {

					@Override
					protected void initChannel(SocketChannel ch) throws Exception {
						// TODO Auto-generated method stub
						ch.pipeline().addLast(new TimeSeverHandler());
					}
				}).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true);

		// 绑定端口，开始接收进来的连接
		ChannelFuture f = b.bind(port).sync();
		System.out.println("*****" + "服务器启动成功" + "*****");

		// 等待服务器Socket关闭
		// 在这个例子中，这个不会发生，但你可以优雅的关闭你的服务器。
		f.channel().closeFuture().sync();

		workerGroup.shutdownGracefully();
		boosGroup.shutdownGracefully();
	}

	/**
	 * @Title: main @Description: TODO(这里用一句话描述这个方法的作用) @param @param args
	 *         设定文件 @return void 返回类型 @throws
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// TODO 运行服务器
		int port = 8080;
		try {
			System.out.println("*****" + "服务器启动中" + "*****");
			new TimeServer(port).run();
		} catch (InterruptedException e) {
			// TODO 打印异常信息
			e.printStackTrace();
			System.out.println("*****" + "服务器启动失败" + "*****");
		}

	}

}
